Išnagrinėkite galingus Python elgesio projektavimo šablonus: Stebėtoją, Strategiją ir Komandą. Sužinokite, kaip pagerinti kodo lankstumą, prižiūrimumą ir mastelio keitimą su praktiniais pavyzdžiais.
Python elgesio šablonai: Stebėtojas, Strategija ir Komanda
Elgesio projektavimo šablonai yra esminiai programinės įrangos kūrėjo įrankiai. Jie sprendžia dažnas objektų komunikacijos ir sąveikos problemas, todėl kodas tampa lankstesnis, lengviau prižiūrimas ir mastelio keičiamas. Šiame išsamiame vadove nagrinėjami trys svarbūs elgesio šablonai Python: Stebėtojas, Strategija ir Komanda. Išnagrinėsime jų paskirtį, įgyvendinimą ir realaus pasaulio pritaikymą, suteikdami jums žinių, kad galėtumėte efektyviai panaudoti šiuos šablonus savo projektuose.
Elgesio šablonų supratimas
Elgesio šablonai orientuojasi į objektų komunikaciją ir sąveiką. Jie apibrėžia algoritmus ir priskiria atsakomybę tarp objektų, užtikrindami silpną susiejimą ir lankstumą. Naudodami šiuos šablonus, galite sukurti sistemas, kurias lengva suprasti, modifikuoti ir išplėsti.
Pagrindiniai elgesio šablonų naudojimo privalumai:
- Pagerintas kodo organizavimas: Apgaubdami specifinį elgesį, šie šablonai skatina moduliškumą ir aiškumą.
- Patobulintas lankstumas: Jie leidžia keisti arba išplėsti sistemos elgesį nekeičiant pagrindinių jos komponentų.
- Sumažintas susiejimas: Elgesio šablonai skatina silpną objektų susiejimą, todėl lengviau prižiūrėti ir testuoti kodo bazę.
- Padidintas pakartotinis naudojimas: Patys šablonai ir kodas, kuris juos įgyvendina, gali būti pakartotinai naudojami skirtingose programos dalyse ar net skirtinguose projektuose.
Stebėtojo šablonas
Kas yra Stebėtojo šablonas?
Stebėtojo šablonas apibrėžia vieno su daugeliu priklausomybę tarp objektų, kad kai vienas objektas (subjektas) pakeičia būseną, visi jo priklausomi objektai (stebėtojai) yra automatiškai informuojami ir atnaujinami. Šis šablonas yra ypač naudingas, kai reikia išlaikyti nuoseklumą tarp kelių objektų, remiantis vieno objekto būsena. Jis taip pat kartais vadinamas „Paskelbk-Prenumeruok“ šablonu.
Pagalvokite apie tai kaip apie prenumeratą žurnalui. Jūs (stebėtojas) užsiregistruojate gauti atnaujinimus (pranešimus), kai tik žurnalas (subjektas) išleidžia naują numerį. Jums nereikia nuolat tikrinti, ar nėra naujų numerių; esate automatiškai informuojamas.
Stebėtojo šablono komponentai
- Subjektas: Objektas, kurio būsena yra svarbi. Jis palaiko stebėtojų sąrašą ir pateikia metodus stebėtojams prijungti (prenumeruoti) ir atjungti (atsisakyti prenumeratos).
- Stebėtojas: Sąsaja arba abstrakti klasė, apibrėžianti atnaujinimo metodą, kurį subjektas iškviečia, kad praneštų stebėtojams apie būsenos pokyčius.
- Konkretus subjektas: Konkreti subjekto įgyvendinimas, kuris saugo būseną ir praneša stebėtojams, kai būsena pasikeičia.
- Konkretus stebėtojas: Konkretus stebėtojo įgyvendinimas, kuris įgyvendina atnaujinimo metodą, kad reaguotų į subjekto būsenos pokyčius.
Python įgyvendinimas
Štai Python pavyzdys, iliustruojantis Stebėtojo šabloną:
class Subject:
def __init__(self):
self._observers = []
self._state = None
def attach(self, observer):
self._observers.append(observer)
def detach(self, observer):
self._observers.remove(observer)
def notify(self):
for observer in self._observers:
observer.update(self._state)
@property
def state(self):
return self._state
@state.setter
def state(self, new_state):
self._state = new_state
self.notify()
class Observer:
def update(self, state):
raise NotImplementedError
class ConcreteObserverA(Observer):
def update(self, state):
print(f"ConcreteObserverA: State changed to {state}")
class ConcreteObserverB(Observer):
def update(self, state):
print(f"ConcreteObserverB: State changed to {state}")
# Example Usage
subject = Subject()
observer_a = ConcreteObserverA()
observer_b = ConcreteObserverB()
subject.attach(observer_a)
subject.attach(observer_b)
subject.state = "New State"
subject.detach(observer_a)
subject.state = "Another State"
Šiame pavyzdyje `Subject` palaiko `Observer` objektų sąrašą. Kai `Subject` `state` pasikeičia, jis iškviečia `notify()` metodą, kuris iteruoja per stebėtojų sąrašą ir iškviečia jų `update()` metodą. Kiekvienas `ConcreteObserver` tada atitinkamai reaguoja į būsenos pasikeitimą.
Realaus pasaulio pritaikymas
- Įvykių apdorojimas: GUI sistemose Stebėtojo šablonas plačiai naudojamas įvykių apdorojimui. Kai vartotojas sąveikauja su UI elementu (pvz., spustelėdamas mygtuką), elementas (subjektas) praneša užregistruotiems klausytojams (stebėtojams) apie įvykį.
- Duomenų transliavimas: Finansinėse programose akcijų kainų nurodytojai (subjektai) transliuoja kainų atnaujinimus užregistruotiems klientams (stebėtojams).
- Skaičiuoklių programos: Kai langelis skaičiuoklėje pasikeičia, priklausomi langeliai (stebėtojai) automatiškai perskaičiuojami ir atnaujinami.
- Socialinių tinklų pranešimai: Kai kas nors paskelbia įrašą socialinės žiniasklaidos platformoje, jų sekėjai (stebėtojai) yra informuojami.
Stebėtojo šablono privalumai
- Silpnas susiejimas: Subjektui ir stebėtojams nereikia žinoti vienas kito konkrečių klasių, o tai skatina moduliškumą ir pakartotinį naudojimą.
- Mastelio keitimas: Naujus stebėtojus galima lengvai pridėti nekeičiant subjekto.
- Lankstumas: Subjektas gali informuoti stebėtojus įvairiais būdais (pvz., sinchroniškai arba asinchroniškai).
Stebėtojo šablono trūkumai
- Netikėti atnaujinimai: Stebėtojai gali būti informuoti apie pokyčius, kuriais jie nesidomi, todėl eikvojami ištekliai.
- Atnaujinimų grandinės: Kaskadiniai atnaujinimai gali tapti sudėtingi ir sunkiai derinami.
- Atminties nutekėjimai: Jei stebėtojai nėra tinkamai atjungti, jie gali būti surinkti šiukšlių, todėl gali atsirasti atminties nutekėjimų.
Strategijos šablonas
Kas yra Strategijos šablonas?
Strategijos šablonas apibrėžia algoritmų šeimą, apgaubia kiekvieną iš jų ir padaro juos keičiamais. Strategija leidžia algoritmui skirtis nepriklausomai nuo klientų, kurie jį naudoja. Šis šablonas yra naudingas, kai turite kelis būdus atlikti užduotį ir norite galėti perjungti juos vykdymo metu nekeičiant kliento kodo.
Įsivaizduokite, kad keliaujate iš vieno miesto į kitą. Galite pasirinkti skirtingas transportavimo strategijas: skristi lėktuvu, važiuoti traukiniu arba automobiliu. Strategijos šablonas leidžia pasirinkti geriausią transportavimo strategiją, atsižvelgiant į tokius veiksnius kaip kaina, laikas ir patogumas, nekeičiant savo tikslo.
Strategijos šablono komponentai
- Strategija: Sąsaja arba abstrakti klasė, apibrėžianti algoritmą.
- Konkreti strategija: Konkretūs strategijos sąsajos įgyvendinimai, kurių kiekvienas atstovauja skirtingą algoritmą.
- Kontekstas: Klasė, kuri palaiko nuorodą į Strategijos objektą ir deleguoja algoritmo vykdymą jam. Kontekstui nereikia žinoti konkretaus Strategijos įgyvendinimo; jis sąveikauja tik su Strategijos sąsaja.
Python įgyvendinimas
Štai Python pavyzdys, iliustruojantis Strategijos šabloną:
class Strategy:
def execute(self, data):
raise NotImplementedError
class ConcreteStrategyA(Strategy):
def execute(self, data):
print("Executing Strategy A...")
return sorted(data)
class ConcreteStrategyB(Strategy):
def execute(self, data):
print("Executing Strategy B...")
return sorted(data, reverse=True)
class Context:
def __init__(self, strategy):
self._strategy = strategy
def set_strategy(self, strategy):
self._strategy = strategy
def execute_strategy(self, data):
return self._strategy.execute(data)
# Example Usage
data = [1, 5, 3, 2, 4]
strategy_a = ConcreteStrategyA()
context = Context(strategy_a)
result = context.execute_strategy(data)
print(f"Result with Strategy A: {result}")
strategy_b = ConcreteStrategyB()
context.set_strategy(strategy_b)
result = context.execute_strategy(data)
print(f"Result with Strategy B: {result}")
Šiame pavyzdyje `Strategy` sąsaja apibrėžia `execute()` metodą. `ConcreteStrategyA` ir `ConcreteStrategyB` pateikia skirtingus šio metodo įgyvendinimus, atitinkamai rūšiuodami duomenis didėjančia ir mažėjančia tvarka. `Context` klasė palaiko nuorodą į `Strategy` objektą ir deleguoja algoritmo vykdymą jam. Klientas gali perjungti strategijas vykdymo metu iškviesdamas `set_strategy()` metodą.
Realaus pasaulio pritaikymas
- Mokėjimų apdorojimas: El. komercijos platformos naudoja Strategijos šabloną, kad palaikytų skirtingus mokėjimo būdus (pvz., kreditinę kortelę, PayPal, banko pavedimą). Kiekvienas mokėjimo būdas yra įgyvendinamas kaip konkreti strategija.
- Siuntimo išlaidų apskaičiavimas: Internetiniai mažmenininkai naudoja Strategijos šabloną, kad apskaičiuotų siuntimo išlaidas, atsižvelgiant į tokius veiksnius kaip svoris, paskirties vieta ir siuntimo būdas.
- Vaizdo glaudinimas: Vaizdo redagavimo programinė įranga naudoja Strategijos šabloną, kad palaikytų skirtingus vaizdo glaudinimo algoritmus (pvz., JPEG, PNG, GIF).
- Duomenų patvirtinimas: Duomenų įvedimo formos gali naudoti skirtingas patvirtinimo strategijas, atsižvelgiant į įvedamų duomenų tipą (pvz., el. pašto adresą, telefono numerį, datą).
- Maršruto algoritmai: GPS navigacijos sistemos naudoja skirtingus maršruto algoritmus (pvz., trumpiausią atstumą, greičiausią laiką, mažiausią eismą), atsižvelgiant į vartotojo nuostatas.
Strategijos šablono privalumai
- Lankstumas: Galite lengvai pridėti naujų strategijų nekeičiant konteksto.
- Pakartotinis naudojimas: Strategijas galima pakartotinai naudoti skirtinguose kontekstuose.
- Apgaubimas: Kiekviena strategija yra apgaubta savo klasėje, o tai skatina moduliškumą ir aiškumą.
- Atviras/Uždaras principas: Galite išplėsti sistemą pridėdami naujų strategijų nekeičiant esamo kodo.
Strategijos šablono trūkumai
- Padidėjęs sudėtingumas: Klasių skaičius gali padidėti, todėl sistema tampa sudėtingesnė.
- Kliento informuotumas: Klientas turi žinoti apie skirtingas galimas strategijas ir pasirinkti tinkamą.
Komandos šablonas
Kas yra Komandos šablonas?
Komandos šablonas apgaubia užklausą kaip objektą, taip leisdamas parametrizuoti klientus skirtingomis užklausomis, įtraukti užklausas į eilę arba registruoti užklausas ir palaikyti anuliuojamas operacijas. Jis atskiria objektą, kuris iškviečia operaciją, nuo objekto, kuris žino, kaip ją atlikti.
Pagalvokite apie restoraną. Jūs (klientas) pateikiate užsakymą (komandą) padavėjui (iškvietėjui). Padavėjas pats negamina maisto; jis perduoda užsakymą virėjui (gavėjui), kuris iš tikrųjų atlieka veiksmą. Komandos šablonas leidžia atskirti užsakymo procesą nuo gaminimo proceso.
Komandos šablono komponentai
- Komanda: Sąsaja arba abstrakti klasė, kuri deklaruoja metodą užklausai vykdyti.
- Konkreti komanda: Konkretūs Komandos sąsajos įgyvendinimai, kurie susieja gavėjo objektą su veiksmu.
- Gavėjas: Objektas, kuris atlieka tikrąjį darbą.
- Iškvietėjas: Objektas, kuris prašo komandos atlikti užklausą. Jis turi Komandos objektą ir iškviečia jo vykdymo metodą, kad inicijuotų operaciją.
- Klientas: Sukuria ConcreteCommand objektus ir nustato jų gavėją.
Python įgyvendinimas
Štai Python pavyzdys, iliustruojantis Komandos šabloną:
class Command:
def execute(self):
raise NotImplementedError
class ConcreteCommand(Command):
def __init__(self, receiver, action):
self._receiver = receiver
self._action = action
def execute(self):
self._receiver.action(self._action)
class Receiver:
def action(self, action):
print(f"Receiver: Performing action '{action}'")
class Invoker:
def __init__(self):
self._commands = []
def add_command(self, command):
self._commands.append(command)
def execute_commands(self):
for command in self._commands:
command.execute()
# Example Usage
receiver = Receiver()
command1 = ConcreteCommand(receiver, "Operation 1")
command2 = ConcreteCommand(receiver, "Operation 2")
invoker = Invoker()
invoker.add_command(command1)
invoker.add_command(command2)
invoker.execute_commands()
Šiame pavyzdyje `Command` sąsaja apibrėžia `execute()` metodą. `ConcreteCommand` susieja `Receiver` objektą su konkrečiu veiksmu. `Invoker` klasė palaiko `Command` objektų sąrašą ir vykdo juos nuosekliai. Klientas sukuria `ConcreteCommand` objektus ir prideda juos prie `Invoker`.
Realaus pasaulio pritaikymas
- GUI įrankių juostos ir meniu: Kiekvienas mygtukas arba meniu elementas gali būti atstovaujamas kaip komanda. Kai vartotojas spusteli mygtuką, vykdoma atitinkama komanda.
- Operacijų apdorojimas: Duomenų bazių sistemose kiekviena operacija gali būti atstovaujama kaip komanda. Tai leidžia naudoti anuliavimo/perdaros funkcijas ir operacijų registravimą.
- Makroįrašų įrašymas: Makroįrašų įrašymo funkcijos programinėse programose naudoja Komandos šabloną, kad užfiksuotų ir atkurtų vartotojo veiksmus.
- Darbo eilės: Sistemos, kurios apdoroja užduotis asinchroniškai, dažnai naudoja darbo eiles, kuriose kiekvienas darbas yra atstovaujamas kaip komanda.
- Nuotolinės procedūros iškvietimai (RPC): RPC mechanizmai naudoja Komandos šabloną, kad apgaubtų nuotolinius metodo iškvietimus.
Komandos šablono privalumai
- Atskyrimas: Iškvietėjas ir gavėjas yra atskirti, todėl užtikrinamas didesnis lankstumas ir pakartotinis naudojimas.
- Eilės sudarymas ir registravimas: Komandas galima įtraukti į eilę ir registruoti, o tai leidžia naudoti tokias funkcijas kaip anuliavimas/perdaros ir audito sekos.
- Parametrizavimas: Komandas galima parametrizuoti skirtingomis užklausomis, todėl jos tampa universalesnės.
- Anuliavimo/perdaros palaikymas: Komandos šablonas leidžia lengviau įgyvendinti anuliavimo/perdaros funkcionalumą.
Komandos šablono trūkumai
- Padidėjęs sudėtingumas: Klasių skaičius gali padidėti, todėl sistema tampa sudėtingesnė.
- Viršutinė riba: Komandų objektų kūrimas ir vykdymas gali sukelti tam tikrą viršutinę ribą.
Išvada
Stebėtojo, Strategijos ir Komandos šablonai yra galingi įrankiai lanksčioms, lengvai prižiūrimoms ir mastelio keičiamoms programinės įrangos sistemoms kurti Python. Suprasdami jų paskirtį, įgyvendinimą ir realaus pasaulio pritaikymą, galite panaudoti šiuos šablonus, kad išspręstumėte dažnas projektavimo problemas ir sukurtumėte patikimesnes ir pritaikomas programas. Atminkite, kad reikia atsižvelgti į kiekvieno šablono kompromisus ir pasirinkti tą, kuris geriausiai atitinka jūsų konkrečius poreikius. Įsisavinus šiuos elgesio šablonus, labai pagerinsite savo, kaip programinės įrangos inžinieriaus, galimybes.